package com.moyun.finance.service;

import com.moyun.finance.entity.Response;
import com.moyun.finance.entity.TypeMenu;
import com.moyun.finance.repository.TypeMenuRepository;
import com.moyun.finance.utils.BaseUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.lang.reflect.Type;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Service
public class TypeMenuService {
    @Autowired
    TypeMenuRepository tmr;

    public Response save(TypeMenu typeMenu){
        typeMenu.setId(BaseUtil.uuid());
        tmr.save(typeMenu);
        return new Response("添加成功!",true);
    }

    public Response update(TypeMenu typeMenu){
        tmr.save(typeMenu);
        return new Response("修改成功!",true);
    }

    public Response delete(TypeMenu typeMenu){
        tmr.delete(typeMenu);
        return new Response("删除成功",true);
    }

    public TypeMenu findOneById(String typeMenuId){
        return tmr.findById(typeMenuId).orElse(null);
    }

    //本公司所有
    public List<TypeMenu> findTree(String companyId, int type){
        List<TypeMenu> allMenus =  tmr.findByCompanyIdAndType(companyId, type);
        List<TypeMenu> rootMenu = new ArrayList<>();
        for(TypeMenu tm : allMenus){
            if("0".equals(tm.getParentId())){
                rootMenu.add(tm);
            }
        }
        for(TypeMenu tm : rootMenu){
            /* 获取根节点下的所有子节点 使用getChild方法*/
            List<TypeMenu> childList = getChild(tm.getId(), allMenus);
            tm.setChildren(childList);//给根节点设置子节点
        }
        return rootMenu;
    }

    /**
     * 获取子节点
     * @param id 父节点id
     * @param allMenu 所有菜单列表
     * @return 每个根节点下，所有子菜单列表
     */
    public List<TypeMenu> getChild(String id, List<TypeMenu> allMenu){
        //子菜单
        List<TypeMenu> childList = new ArrayList<>();
        for (TypeMenu tm : allMenu) {
            // 遍历所有节点，将所有菜单的父id与传过来的根节点的id比较
            //相等说明：为该根节点的子节点。
            if(tm.getParentId().equals(id)){
                childList.add(tm);
            }
        }
        //递归
        for (TypeMenu nav : childList) {
            nav.setChildren(getChild(nav.getId(), allMenu));
        }
        //如果节点下没有子节点，返回一个空List（递归退出）
        if(childList.size() == 0){
            return null;
        }
        return childList;
    }
}
